www.gusucode.com > VC++ 系统进程管理器源码-源码程序 > VC++ 系统进程管理器源码-源码程序/code/Src_EvilSword/ServiceEnum.cpp
//Download by http://www.NewXing.com // ServiceEnum.cpp : implementation file // #include "stdafx.h" #include "EvilSword.h" #include "ServiceEnum.h" #include "resource.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CServiceEnum dialog CServiceEnum::CServiceEnum(CWnd* pParent /*=NULL*/) : CDialog(CServiceEnum::IDD, pParent) { //{{AFX_DATA_INIT(CServiceEnum) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } void CServiceEnum::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CServiceEnum) DDX_Control(pDX, IDC_LIST1, m_ServiceList); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CServiceEnum, CDialog) //{{AFX_MSG_MAP(CServiceEnum) ON_WM_SHOWWINDOW() ON_NOTIFY(NM_RCLICK, IDC_LIST1, OnRclickList1) ON_COMMAND(ID_UPDATE, OnUpdate) ON_COMMAND(ID_PAUSE, OnPause) ON_COMMAND(ID_STOP, OnStop) ON_COMMAND(ID_START, OnStart) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CServiceEnum message handlers //枚举Win32服务 void CServiceEnum::ListWin32Servces() { //打开服务控制管理器获得句柄 SC_HANDLE hSCM=OpenSCManager(NULL,SERVICES_ACTIVE_DATABASE,SC_MANAGER_ENUMERATE_SERVICE|GENERIC_READ); if (hSCM==NULL) { AfxMessageBox("打开服务控制管理器失败"); return; } //保存这个服务控制管理器的句柄 //结构数组 ENUM_SERVICE_STATUS nService[400]; //接收实际枚举的服务个数 DWORD nReturn=0; DWORD nNeed=0; //开始枚举 BOOL isSuccess=EnumServicesStatus(hSCM, //服务控制管理器的句柄 SERVICE_WIN32, //要枚举的服务类型 SERVICE_STATE_ALL, //要枚举服务的状态SERVICE_STATE_ALL 表示不论活动部活动的都枚举 nService, //接收返回信息的缓冲区 400*sizeof(ENUM_SERVICE_STATUS), //缓冲区字节大小 &nNeed, //接收返回的需要字节数 &nReturn, //接收实际枚举的服务个数 0) ; //第一次调用置为0 if (isSuccess==0) { AfxMessageBox("枚举失败"); return; } //显示在列表 for (UINT i=0;i<nReturn;i++) { m_ServiceList.InsertItem(i,nService[i].lpServiceName); m_ServiceList.SetItemText(i,1,nService[i].lpDisplayName); InsertServiceStates(i,nService[i].ServiceStatus,nService[i].lpServiceName,hSCM); } CString szText; szText.Format("当前服务数为: %d",nReturn); //显示进程数 ::SetDlgItemText(AfxGetMainWnd()->m_hWnd,STATIC_TISHI,szText); } BOOL CServiceEnum::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here //添加列信息 由于所有的项都太长只好,自己指定列的长度,不用于项目的长度相同 m_ServiceList.InsertColumn(0,"服务名",LVCFMT_LEFT,80); m_ServiceList.InsertColumn(1,"显示名称",LVCFMT_LEFT,170); m_ServiceList.InsertColumn(2,"状态",LVCFMT_LEFT,60);; m_ServiceList.InsertColumn(3,"启动类型",LVCFMT_LEFT,70); m_ServiceList.InsertColumn(4,"映象路径",LVCFMT_LEFT,200); //设置样式让其有表格 m_ServiceList.SetExtendedStyle(m_ServiceList.GetExtendedStyle()|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CServiceEnum::OnShowWindow(BOOL bShow, UINT nStatus) { CDialog::OnShowWindow(bShow, nStatus); // TODO: Add your message handler code here //只有是显示窗口状态时才 枚举 if (bShow==TRUE) { ListWin32Servces(); } } //查询状态 并写入列表控件 void CServiceEnum::InsertServiceStates(int nIndex,SERVICE_STATUS Status,LPTSTR ServiceName,SC_HANDLE hSCM) { CString szType; //结构体变量指针 查询一个服务的状态信息 QUERY_SERVICE_CONFIG* ServiceConfig=(QUERY_SERVICE_CONFIG*)new BYTE[2048]; switch (Status.dwCurrentState) { case SERVICE_RUNNING: szType.Format("%s","已启动"); m_ServiceList.SetItemText(nIndex,2,szType); break; case SERVICE_STOPPED: szType.Format("%s","已停止"); m_ServiceList.SetItemText(nIndex,2,szType); break; case SERVICE_PAUSED: szType.Format("%s","已暂停"); m_ServiceList.SetItemText(nIndex,2,szType); break; default: szType.Format("%s","未知状态"); m_ServiceList.SetItemText(nIndex,2,szType); break; } //根据服务名和控制服务器句柄打开服务SERVICE_QUERY_CONFIG权限 来查询其启动类型 SC_HANDLE hService=OpenService(hSCM,ServiceName,SERVICE_QUERY_CONFIG); if (hService==NULL) { AfxMessageBox(TEXT("打开服务失败")); return; } DWORD nRet=0; //查询 if (QueryServiceConfig(hService,ServiceConfig,2048,&nRet)) { //启动类型 switch(ServiceConfig->dwStartType) { case SERVICE_AUTO_START: szType.Format("%s","自动"); m_ServiceList.SetItemText(nIndex,3,szType); break; case SERVICE_DEMAND_START: szType.Format("%s","手动"); m_ServiceList.SetItemText(nIndex,3,szType); break; case SERVICE_DISABLED: szType.Format("%s","已禁用"); m_ServiceList.SetItemText(nIndex,3,szType); break; case SERVICE_BOOT_START: szType.Format("%s","引导启动"); m_ServiceList.SetItemText(nIndex,3,szType); break; case SERVICE_SYSTEM_START: szType.Format("%s","系统启动"); m_ServiceList.SetItemText(nIndex,3,szType); break; default: szType.Format("%s","未知"); m_ServiceList.SetItemText(nIndex,3,szType); break; } //添加映象路径 m_ServiceList.SetItemText(nIndex,4,ServiceConfig->lpBinaryPathName); } } //右键单击消息处理 void CServiceEnum::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here POINT pt; //获取鼠标光标的位置 GetCursorPos(&pt); CMenu menu; //加载菜单资源 menu.LoadMenu(105); //弹出 menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,pt.x,pt.y,this); *pResult = 0; } void CServiceEnum::OnUpdate() { // TODO: Add your command handler code here m_ServiceList.DeleteAllItems(); ListWin32Servces(); } //暂停服务 void CServiceEnum::OnPause() { // TODO: Add your command handler code here POSITION ps=m_ServiceList.GetFirstSelectedItemPosition(); //如果没得到位置就不做任何处理 if (ps==NULL) { return; } //得到选中的行的索引 int nIndex=m_ServiceList.GetNextSelectedItem(ps); //得到选中的服务的运行状态 CString szText=m_ServiceList.GetItemText(nIndex,2); if (szText.CompareNoCase("已暂停")==0) { AfxMessageBox(TEXT("服务已经暂停不需要再暂停")); return; } //打开服务控制管理器获得句柄 SC_HANDLE hSCM=OpenSCManager(NULL,SERVICES_ACTIVE_DATABASE,SC_MANAGER_ENUMERATE_SERVICE|GENERIC_READ); if (hSCM==NULL) { AfxMessageBox("打开服务控制管理器失败"); return; } //得到服务名 szText=m_ServiceList.GetItemText(nIndex,0); //通过服务名打开服务 SC_HANDLE hService=OpenService(hSCM,szText,SERVICE_ALL_ACCESS|SERVICE_PAUSE_CONTINUE); //给服务发送控制码来停止服务 BOOL isSuccess= ControlService(hService,SERVICE_CONTROL_PAUSE,NULL); //关闭句柄 CloseHandle(hService); if (!isSuccess) { AfxMessageBox(TEXT("暂停失败")); return; } } //停止服务 void CServiceEnum::OnStop() { // TODO: Add your command handler code here POSITION ps=m_ServiceList.GetFirstSelectedItemPosition(); //如果没得到位置就不做任何处理 if (ps==NULL) { return; } //得到选中的行的索引 int nIndex=m_ServiceList.GetNextSelectedItem(ps); //得到选中的服务的运行状态 CString szText=m_ServiceList.GetItemText(nIndex,2); if (szText.CompareNoCase("已停止")==0) { AfxMessageBox(TEXT("服务已经停止不需要再停止")); return; } //打开服务控制管理器获得句柄 SC_HANDLE hSCM=OpenSCManager(NULL,SERVICES_ACTIVE_DATABASE,SC_MANAGER_ENUMERATE_SERVICE|GENERIC_READ); if (hSCM==NULL) { AfxMessageBox("打开服务控制管理器失败"); return; } //得到服务名 szText=m_ServiceList.GetItemText(nIndex,0); //通过服务名打开服务 SC_HANDLE hService=OpenService(hSCM,szText,SERVICE_ALL_ACCESS|SERVICE_STOP ); //给服务发送控制码来停止服务 BOOL isSuccess= ControlService(hService,SERVICE_CONTROL_STOP,NULL); //关闭句柄 CloseHandle(hService); if (!isSuccess) { AfxMessageBox(TEXT("停止失败")); return; } } //开始服务 void CServiceEnum::OnStart() { // TODO: Add your command handler code here POSITION ps=m_ServiceList.GetFirstSelectedItemPosition(); //如果没得到位置就不做任何处理 if (ps==NULL) { return; } //得到选中的行的索引 int nIndex=m_ServiceList.GetNextSelectedItem(ps); //得到选中的服务的运行状态 CString szText=m_ServiceList.GetItemText(nIndex,2); if (szText.CompareNoCase("已启动")==0) { AfxMessageBox(TEXT("服务已经启动不需要在启动")); return; } //打开服务控制管理器获得句柄 SC_HANDLE hSCM=OpenSCManager(NULL,SERVICES_ACTIVE_DATABASE,SC_MANAGER_ENUMERATE_SERVICE|GENERIC_READ); if (hSCM==NULL) { AfxMessageBox("打开服务控制管理器失败"); return; } //得到服务名 szText=m_ServiceList.GetItemText(nIndex,0); //通过服务名打开服务 SC_HANDLE hService=OpenService(hSCM,szText,SERVICE_ALL_ACCESS|SERVICE_START); BOOL isSuccess= StartService(hService,NULL,NULL); //关闭句柄 CloseHandle(hService); if (!isSuccess) { AfxMessageBox(TEXT("开启失败")); return; } }